iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 24
1

DateTime

表示時間的瞬間,通常以一天的日期和時間表示。

今天來介紹日期格式的使用方式。

DateTime 是一個 Struct 結構,表示某一個時間點,如現在這個時分秒、資料建立的那一天,也可以用來計算程式執行的時間。

建立一個 DateTime

建立一個 DateTime 可以透過 new 初始化,或者 DateTime 的靜態類別來產生。

透過 new 的方式,我們可以指定任何一天的任何一個時間點,如

var today = new DateTime (2018, 11, 3);
var todayNoon = new DateTime (2018, 11, 3, 12, 0, 0);

最常使用的為這兩種方法,給予年月日的 int 引數,以及給予年月日時分秒的 int 引數。

透過靜態屬性傳回的 DateTime,則只能選擇現在,如

var today = DateTime.Today;
var now = DateTime.Now; 

因為是程式執行當下的系統時間,所以可以用來計算程式執行的時間點與時間差。

DateTime 屬性

int now = DateTime.Now;
int year = now.Year;
int month = now.Month;
int day = now.Day;
int hour = now.Hour;
int minute = now.Minute;
int second = now.Second;
int millisecond = now.Millisecond;
DayOfWeek dayOfWeek = now.DayOfWeek;
int dayOfYear = now.DayOfYear;

這邊列出部分的屬性,其中 DayOfWeek 是一個 enum 值,是一個從星期日開始數到星期六的枚舉,可以得到 DateTime 是屬於一周中的禮拜幾,而 DayOfYear 則是屬於一年中的第幾天。

計算 DateTime

建立一個日期格式的目的,當然是做日期的計算,例如計算天數差異、是否符合特定的日期區間,或者上面提到的程式執行相關作業等。

Add

日期格式的加減,用數字來進行加減,並傳回一個新的 DateTime 如

var now = DateTime.Now;
var tomorrow = now.AddDays (1);
var yesterday = now.AddDays (-1);
var add1hour = now.AddHours (1);

每一個代表時間的屬性都有對應的加減方法,可以看到只有一個相對的方法,藉由正負數來加減,比較常用的有建立某個月的最後一天時,如

var theLastDayOfNovember = new DateTime (2018, 12, 1).AddDays (-1);

藉由下一個月份的第一天往前推一天來取得,不然每一個月的天數不一樣,在初始化時,還要針對該月份做變動。

Subtract

日期格式的相減,用另一個 DateTime 去做相減,傳回一個 TimeSpan,如

var startTime = DateTime.Now;

// do something...
System.Threading.Thread.Sleep (2 * 1000);

var endTime = DateTime.Now;
var spentTime = endTime.Subtract (startTime);
var totalSecond = spentTime.TotalSeconds;

這邊使用執行續的方法,讓程式等待 2 * 1000 毫秒,來假裝執行一個運算過程,並記錄花費時間。

題外話:TimeSpan 是一個以日為最大單位的時間格式。

用減的方式也可以直接使用 - 符號,如

var spentTime = endTime - startTime;

因為 Add 不能 DateTime + DateTime,而是 DateTime 以及 TimeSpan 相加,所以使用 + 時依然是 DateTime 以及 TimeSpan,所以不特別介紹。

DateTime 轉換成字串

當日期格式需要顯示在畫面時,就需要轉換成特定字串,像是最常見的 2018/11/03 格式,或者更多的格式時,都可以來使用 ToString 來進行,也有只印出年日月的方法 ToLongDateString、ToShortDateString 或者只印出時分秒的方法 ToLongTimeString、ToShortTimeString,也可以客製化自己的時間格式,如 11/2018/03 這種奇怪格式,我們只需要在 ToString 帶入相關的引數,就可以替換成符合的成員了,如

var monthYearDay = DateTime.Now.ToString ("MM/yyyy/dd");

引數內容就請自行到官方查看,這邊就不列出相關內容了,

民國年

有些時候可能會要求顯示年份需以民國年的方式,因為 DateTime 無法繼承,所以我們用擴充方法的方式來擴充功能,這邊很簡單的示範如

class Program {
  static void Main (string[] args) {
    var nowTW = DateTime.Now.ToTWDate ("/MM/dd");
  }
}
static class DateTimeExtensionMethods {
  public static int ToTWYear (this DateTime dateTime) {
    return dateTime.Year - 1911;
  }
  public static string ToTWDate (this DateTime dateTime, string MMdd) {
    return dateTime.ToTWYear () + dateTime.ToString (MMdd);
  }
}

多了一個傳回民國年的方法,以及傳回民國年組合的日期字串,不是什麼很好用的例子,只是舉例一下別忘了有擴充方法,即便無法更改原類別,我們還是可以多一些自己想要的方法。

一些小結論

今天介紹了基礎的日期格式用法,算是常用的類別之一,所以很簡單的說明如何去初始化,以及一些運算操作,順便回憶一下之前提到的擴充方法。

感謝閱讀。

參考連結
DateTime Struct (System) | Microsoft Docs
DateTime.ToString Method (System) | Microsoft Docs


上一篇
DAY 23 LINQ 查詢運算式(二)
下一篇
DAY 25 Type
系列文
.net 後端起手式 30天認識 C# 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言